﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using EntityLayer;
using FacadeImplemention;
using FacadeInterface;
using System.ComponentModel;
using DevExpress.Web.ASPxEditors;
using DevExpress.Web.ASPxGridView;

namespace pryCallCenter.Procesos.ActualizarPresupuesto
{
    public partial class frmActualizarPresupuesto : System.Web.UI.Page
    {
        clsIFacadeActualizarPresupuesto InterfaceActualizarPresupuesto = new clsFacadeActualizarPresupuesto();
        private static List<strGrupo> ListaGrupo = null;
        private static Boolean Update;

        String msg, titulo;

        protected void Page_Load(object sender, EventArgs e)
        {
            try
            {
                if (!IsPostBack)
                {
                    if (Session["USUARIO"] != null)
                    {
                        dtpFecha.Date = DateTime.Now.Date;
                        ListaGrupo = new List<strGrupo>();

                        txtUsuario.Text = ((Persona)Session["USUARIO"]).Nombres;
                        LlenarGrilla(((Persona)Session["USUARIO"]).CodigoPersona);
                        //RetornarEmpresa(((Persona)Session["USUARIO"]).CodigoPersona);
                        txtNPresupuesto.Text = dtpFecha.Date.ToString("yyyyMM");
                        dtpFechaPresupuesto.Date = DateTime.Now.Date;
                        ListarEmpresa();
                        SeleccionarValue(((Persona)Session["USUARIO"]).Empleado.CodigoEmpresa);
                        dgvDetalle.Enabled = false;
                        txtCantidadProducto.Enabled = false;
                        Update = false;
                    }
                    else
                    {
                        Response.Redirect("~/Account/Login.aspx");
                    }
                }
            }
            catch (Exception ex)
            {
                titulo = "ERROR AL CARGAR LA PAGINA";
                msg = ex.Message;
                MostrarComentario(msg, titulo);
            }
        }

        private void SeleccionarValue(int? ID)
        {
            try
            {
                for (int i = 0; i < cboEmpresa.Items.Count; i++)
                {
                    if (Convert.ToInt32(cboEmpresa.Items[i].Value) == ID)
                    {
                        cboEmpresa.SelectedIndex = i;
                        break;
                    }
                }
            }
            catch (Exception ex)
            {
                titulo = "ERROR AL SELECCIONAR EL VALOR";
                msg = ex.Message;
                MostrarComentario(msg, titulo);
            }
        }

        private void ListarEmpresa()
        {
            try
            {
                cboEmpresa.DataSource = InterfaceActualizarPresupuesto.ListarEmpresa();
                cboEmpresa.TextField = "RazonSocial";
                cboEmpresa.ValueField = "CodigoEmpresa";
                cboEmpresa.DataBind();
            }
            catch (Exception ex)
            {
                titulo = "ERROR AL LISTAR LAS EMPRESAS";
                msg = ex.Message;
                MostrarComentario(msg, titulo);
            }
        }

        public void LlenarGrilla(int ID)
        {
            try
            {
                ListaGrupo.Clear();
                var q = from gt in InterfaceActualizarPresupuesto.Listargrupo()
                        from e in InterfaceActualizarPresupuesto.ListarEmpleados()
                        where gt.CodigoGrupo == e.GrupoTrabajo
                        where gt.CodigoPersona == ID
                        group gt by new
                        {
                            gt.CodigoGrupo
                        } into g
                        select new
                        {
                            g.Key.CodigoGrupo,
                            NOperadores = (Int64)g.Count()
                        };

                foreach (var s in q)
                {
                    ListaGrupo.Add(new strGrupo() { Codigo = s.CodigoGrupo, NOperadores = s.NOperadores });
                }

                dgvDetalle.DataSource = ListaGrupo;
                dgvDetalle.DataBind();

            }
            catch (Exception ex)
            {
                titulo = "ERROR AL LISTAR LA GRILLA";
                msg = ex.Message;
                MostrarComentario(msg, titulo);
            }
        }

        protected void btnOK_Click(object sender, EventArgs e)
        {
            Grabar();
        }

        private void Grabar()
        {
            try
            {
                Boolean insert = false;
                int numero = 1;
                int error = 0;
                if (dtpFechaPresupuesto.Text.Trim() != "" && cboEmpresa.SelectedItem != null && txtCantidadProducto.Text.Trim() != "")
                {
                    if (Update == true)
                    {
                        int? mes;
                        int? mesActual = DateTime.Now.Date.Month;
                        DateTime fechaPresupuesto = Convert.ToDateTime(dtpFechaPresupuesto.Value);
                        mes = fechaPresupuesto.Month;
                        if (mes < mesActual)
                        {
                            numero = 0;
                            error = 5;
                        }
                    }
                    Double cantidad = 0;
                    if (numero != 0)
                    {
                        if (!Double.TryParse(txtCantidadProducto.Text.Trim(), out cantidad))
                        {
                            numero = 0;
                            error = 3;
                        }
                    }
                    if (numero != 0)
                    {
                        if (cantidad > 0)
                        {
                            Double monto = 0;
                            Double sumaMonto = 0;
                            for (int i = 0; i < dgvDetalle.VisibleRowCount; i++)
                            {
                                ASPxTextBox txt = (ASPxTextBox)dgvDetalle.FindRowCellTemplateControl(i, null, "txtMonto");
                                if (txt.Text.Trim() == "")
                                {
                                    numero = 0;
                                    error = 1;
                                    break;
                                }
                                else
                                {
                                    if (!Double.TryParse(txt.Text.Trim(), out monto))
                                    {
                                        numero = 0;
                                        error = 2;
                                        break;
                                    }
                                    if (monto <= 0)
                                    {
                                        numero = 0;
                                        error = 2;
                                        break;
                                    }
                                }
                                sumaMonto += monto;
                            }
                            if (sumaMonto != cantidad & numero == 1)
                            {
                                numero = 0;
                                error = 4;
                            }
                            if (numero != 0)
                            {
                                Presupuesto obj = new Presupuesto();
                                obj.Empresa = Convert.ToInt32(cboEmpresa.SelectedItem.Value);
                                obj.Periodo = txtNPresupuesto.Text.Trim();
                                obj.Monto = Convert.ToDecimal(txtCantidadProducto.Text.Trim());
                                obj.FechaCreacion = DateTime.Now;
                                if ((Update == true ? InterfaceActualizarPresupuesto.ModificarPresupuesto(obj) : InterfaceActualizarPresupuesto.GrabarPresupuesto(obj)))
                                {

                                    for (int i = 0; i < dgvDetalle.VisibleRowCount; i++)
                                    {
                                        PresupuestoDistribucion item = new PresupuestoDistribucion();
                                        item.Empresa = Convert.ToInt32(cboEmpresa.SelectedItem.Value);
                                        item.Periodo = obj.Periodo;
                                        item.GrupoTrabajo = dgvDetalle.GetRowValues(i, "Codigo").ToString();

                                        ASPxTextBox txt = (ASPxTextBox)dgvDetalle.FindRowCellTemplateControl(i, null, "txtMonto");
                                        if (txt.Text.Trim() == "")
                                        {
                                            numero = 0;
                                            error = 1;
                                            break;
                                        }
                                        else
                                        {
                                            if (!Double.TryParse(txt.Text.Trim(), out monto))
                                            {
                                                numero = 0;
                                                error = 2;
                                                break;
                                            }
                                        }

                                        item.Monto = Convert.ToDecimal(monto);

                                        if ((Update == true ? InterfaceActualizarPresupuesto.ModificarPresupuestoDistribucion(item) : InterfaceActualizarPresupuesto.GrabarPresupuestoDistribucion(item)))
                                        {
                                            insert = true;
                                        }
                                        else
                                        {
                                            insert = false;
                                        }
                                    }
                                }
                            }
                        }
                        else
                        {
                            numero = 0;
                            error = 3;

                        }
                    }

                    if (insert == true && numero != 0)
                    {
                        titulo = "Mensaje";
                        msg = (Update == true) ? "Se Modifico correctamente." : "Se Grabo correctamente.";
                        MostrarComentario(msg, titulo);
                        Update = true;
                    }
                    else
                    {
                        if (error == 0)
                        {
                            msg = "Se produjo un error al grabar.";
                        }
                        else if (error == 1)
                        {
                            msg = "Debe Ingresar Los Numeros de Ventas en la Meta.";
                        }
                        else if (error == 2)
                        {
                            msg = "Los Numeros de Ventas Deben Ser Numericos y Mayores a Cero.";
                        }
                        else if (error == 3)
                        {
                            msg = "Los Cantidad Debe Ser Numerica y Mayor a Cero.";
                        }
                        else if (error == 4)
                        {
                            msg = "Los Suma de Los Cantidades del Numero de Ventas No Coninciden Con La Cantidad Total.";
                        }
                        else if (error == 5)
                        {
                            msg = "No Se Puede Modificar Un Presupuesto de Meses Anteriores Al Actual.";
                        }
                        MostrarComentario(msg);
                    }
                }
                else
                {
                    if (dtpFechaPresupuesto.Text.Trim() == "")
                    {
                        titulo = "Mensaje";
                        msg += "No se ha ingresado el mes del presupuesto.\n";
                    }
                    if (cboEmpresa.SelectedItem == null)
                    {
                        titulo = "Mensaje";
                        msg += "Debe Seleccionar una Empresa\n";
                    }
                    if (txtCantidadProducto.Text.Trim() == "")
                    {
                        titulo = "Mensaje";
                        msg += "Debe Ingresar una Cantidad\n";
                    }
                    MostrarComentario(msg, titulo);
                }
            }
            catch (Exception ex)
            {
                titulo = "ERROR AL GRABAR.";
                msg = ex.Message;
                MostrarComentario(msg, titulo);
            }
        }

        protected void btnBuscarPresupuesto_Click(object sender, EventArgs e)
        {
            try
            {
                ListaGrupo.Clear();
                var q = from pd in InterfaceActualizarPresupuesto.ListarPresupuestoDetalle()
                        from E in InterfaceActualizarPresupuesto.ListarEmpleados()
                        where pd.GrupoTrabajo == E.GrupoTrabajo
                        where pd.Periodo == txtNPresupuesto.Text.Trim()
                        group pd by new
                        {
                            pd.GrupoTrabajo,
                            pd.Monto
                        } into g
                        select new
                        {
                            g.Key.GrupoTrabajo,
                            Monto = (Decimal?)g.Key.Monto,
                            NOperadores = (Int64)g.Count()
                        };

                if (q.ToList().Count > 0)
                {

                    foreach (var s in q)
                    {
                        ListaGrupo.Add(new strGrupo() { Codigo = s.GrupoTrabajo, NOperadores = s.NOperadores, Meta = s.Monto });
                    }

                }
                else
                {
                    var qx = from gt in InterfaceActualizarPresupuesto.Listargrupo()
                             from em in InterfaceActualizarPresupuesto.ListarEmpleados()
                             where gt.CodigoGrupo == em.GrupoTrabajo
                             where gt.CodigoPersona == ((Persona)Session["USUARIO"]).CodigoPersona
                             group gt by new
                             {
                                 gt.CodigoGrupo
                             } into g
                             select new
                             {
                                 g.Key.CodigoGrupo,
                                 NOperadores = (Int64)g.Count()
                             };

                    foreach (var s in qx)
                    {
                        ListaGrupo.Add(new strGrupo() { Codigo = s.CodigoGrupo, NOperadores = s.NOperadores });
                    }

                    dgvDetalle.DataSource = ListaGrupo;
                    dgvDetalle.DataBind();

                    cboEmpresa.SelectedIndex = -1;
                    txtCantidadProducto.Text = String.Empty;
                    Update = false;

                    dgvDetalle.Enabled = true;
                    txtCantidadProducto.Enabled = true;
                    return;
                }

                var sql = from p in InterfaceActualizarPresupuesto.ListarPresupuesto()
                          where p.Periodo == txtNPresupuesto.Text.Trim()
                          select p;

                int empresaid = 0;
                foreach (var s in sql)
                {
                    txtCantidadProducto.Text = s.Monto.ToString();
                    dtpFechaPresupuesto.Date = Convert.ToDateTime(String.Format("01/{0}/{1}", s.Periodo.Substring(4), s.Periodo.Substring(0, 4)));
                    empresaid = s.Empresa;
                }

                SeleccionarValue(empresaid);

                dgvDetalle.DataSource = ListaGrupo;
                dgvDetalle.DataBind();
                dgvDetalle.Enabled = true;
                txtCantidadProducto.Enabled = true;
                Update = true;

            }
            catch (Exception ex)
            {
                titulo = "ERROR AL BUSCAR EL PRESUPUESTO";
                msg = ex.Message;
                MostrarComentario(msg, titulo);
            }
        }

        protected void btnCancelar_Click(object sender, EventArgs e)
        {
            Update = false;
            Response.Redirect("frmActualizarPresupuesto.aspx");
        }

        protected void dtpFechaPresupuesto_DateChanged(object sender, EventArgs e)
        {
            txtNPresupuesto.Text = dtpFechaPresupuesto.Date.ToString("yyyyMM");
            txtCantidadProducto.Enabled = false;
            dgvDetalle.Enabled = false;
            txtCantidadProducto.Text = "";
        }

        public struct strGrupo
        {
            public String Codigo { get; set; }
            public Int64 NOperadores { get; set; }
            public Decimal? Meta { get; set; }
        }

        private void MostrarComentario(String msg)
        {
            CargarAlert(msg, "Mensaje");
        }

        private void MostrarComentario(String msg, String titulo)
        {
            CargarAlert(msg, titulo);
        }

        private void CargarAlert(String msg, String titulo)
        {
            pcMensaje.HeaderText = titulo;
            lblMensaje.Text = msg;
            ScriptManager.RegisterStartupScript(this, GetType(), "script", "pcMensaje.Show();", true);
        }
    }
}